package Elementary_algorithm.Math;

import org.junit.Test;

/*
3的幂
给定一个整数，写一个函数来判断它是否是 3的幂次方。如果是，返回 true ；否则，返回 false 。
整数 n 是 3 的幂次方需满足：存在整数 x 使得 n == 3x

示例 1：
输入：n = 27
输出：true
示例 2：
输入：n = 0
输出：false
示例 3：
输入：n = 9
输出：true
示例 4：
输入：n = 45
输出：false

提示：
-231 <= n <= 231 - 1
作者：LeetCode
链接：https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnsdi2/
 */
public class _03三的幂 {

    @Test
    public void test() {
        System.out.println(isPowerOfThree(45));
    }

    //方法一：试除法
    public boolean isPowerOfThree(int n) {
        if(n==0) return false;
        while(n!= 1){
            if(n%3!=0) return false;
            n/=3;
        }
        return true;
    }
    //官方写法
    class Solution {
        public boolean isPowerOfThree(int n) {
            while (n != 0 && n % 3 == 0) {
                n /= 3;
            }
            return n == 1;
        }
    }

    //方法二：判断是否为最大3的幂的约数
    //我们还可以使用一种较为取巧的做法。
    //在题目给定的32位有符号整数的范围内，最大的3的幂为3^19=1162261467。
    //我们只需要判断n是否是3^19的约数即可。
    //与方法一不同的是，这里需要特殊判断n是负数或0的情况。
    //来源：力扣（LeetCode）
    //著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
    /*
    作者：力扣官方题解
    链接：https://leetcode.cn/problems/power-of-three/solutions/1011809/3de-mi-by-leetcode-solution-hnap/
     */
    class Solution2 {
        public boolean isPowerOfThree(int n) {
            return n > 0 && 1162261467 % n == 0;
        }
    }



}
